package ar.edu.utn.frba.dds.aterrizar.usuarios;

import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frba.dds.aterrizar.aerolineas.AerolineasInterface;
import ar.edu.utn.frba.dds.aterrizar.busquedas.Busqueda;
import ar.edu.utn.frba.dds.aterrizar.busquedas.Vuelo;


public class Usuario {
	private  HomeUsuarios centroDeUsuarios = HomeUsuarios.getInstance();
	private TipoDeUsuario tipoDeUsuario;
	private String nombre;
	private String apellido;
	private String DNI;
	private Busqueda busqueda;
	private float TotalPrecioDeCompras = 0;
	private ArrayList<Busqueda> busquedasRealizadas = new ArrayList<Busqueda>();
	
	public Usuario(String unNombre, TipoDeUsuario unTipo, String unApellido, String unDNI, Busqueda busqueda) {
		this.setApellido(unApellido);
		this.setNombre(unNombre);
		this.setTipoDeUsuario(unTipo);
		this.setDNI(unDNI);
		this.setBusqueda(busqueda);
		this.centroDeUsuarios.getUsuariosRegistrados().add(this);
	}
	
	public Busqueda getBusqueda() {
		return busqueda;
	}

	public void setBusqueda(Busqueda busqueda) {
		this.busqueda = busqueda;
	}

	public float getTotalPrecioDeCompras() {
		return TotalPrecioDeCompras;
	}
	
	public TipoDeUsuario getTipoDeUsuario() {
		return tipoDeUsuario;
	}

	public void setTipoDeUsuario(TipoDeUsuario tipoDeUsuario) {
		this.tipoDeUsuario = tipoDeUsuario;
	}
	
	public int getRecargo() {
		return this.getTipoDeUsuario().getRecargo();
	}
	
	public	ArrayList<Vuelo> buscarVuelos(AerolineasInterface aerolinea) {
		busquedasRealizadas.add(busqueda);
		List<Vuelo> vuelosGenerales = buscarVuelos(aerolinea, busqueda);
		ArrayList<Vuelo> vuelosBuscados = new ArrayList<Vuelo>();
		for(Vuelo unVuelo: vuelosGenerales) {
			if(unVuelo.cumpleRequerimientosExtras(this) && unVuelo.esVisiblePara(aerolinea, this)) {
				vuelosBuscados.add(unVuelo);
			}
		}
		return vuelosBuscados;
	}
	
	public	List<Vuelo> buscarVuelos(AerolineasInterface aerolinea, Busqueda busqueda) {
		ArrayList<Vuelo> asientos;
		if(busqueda.getIncluirReservados()) {
			asientos = aerolinea.getAsientosBuscadosIncluyendoReservados(busqueda.getOrigen(), busqueda.getDestino(),
			busqueda.getRangoFechas().getFechaSalida(), busqueda.getRangoFechas().getFechaLlegada(),
			busqueda.getRangoFechas().getHoraSalida(), busqueda.getRangoFechas().getHoraLlegada());
		} else {
			asientos = aerolinea.getAsientosBuscados(busqueda.getOrigen(), busqueda.getDestino(),
			busqueda.getRangoFechas().getFechaSalida(), busqueda.getRangoFechas().getFechaLlegada(),
			busqueda.getRangoFechas().getHoraSalida(), busqueda.getRangoFechas().getHoraLlegada());
		}
		return asientos;
	}
	 
	public	void comprarVuelo(Vuelo vuelo) {
		vuelo.getAerolinea().comprarVuelo(vuelo, this);
		this.tipoDeUsuario.registrarCompra(this, vuelo.getAerolinea().calcularPrecioDeUnVuelo(vuelo, this));
	}
	
//	public	void reservarVuelo(AerolineaLanchita aerolinea, String codigo, Date fechaExpiracion) 
//	{
//		Asiento oAsiento = new Asiento();
//		
//		oAsiento.codigoVuelo = codigo;
//		oAsiento.Fecha = fechaExpiracion;
//		Reserva oReserva = new Reserva();
//		oReserva.Reservar(aerolinea, oAsiento, this);
//	}
	public	void reservarVuelo(Vuelo vuelo /*, Date fechaExpiracion*/) {
		vuelo.getAerolinea().reservarVuelo(vuelo, this);
	}
		
//	{
//		Asiento oAsiento = new Asiento();
//		
//		oAsiento.codigoVuelo = codigo;
//		oAsiento.Fecha = fechaExpiracion;
//		Reserva oReserva = new Reserva();
//		oReserva.Reservar(aerolinea, oAsiento, this);
//	}
	public void actualizarCompras(float unMonto) {
		TotalPrecioDeCompras += unMonto; 
	}
	
	public boolean getActitudSuperoferta() {
		return this.getTipoDeUsuario().getActitudSupeoferta();
	}

	public String getDNI() {
		
		return this.DNI;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public void setDNI(String dni) {
		DNI = dni;
	}
	
	public void setApellido(String apellido) {
		this.apellido = apellido;
	}
}
